package cn.bonoon.kernel.menus;

import cn.bonoon.kernel.util.StringHelper;

/**
 * 所有可进行菜单化的，都应该继承这个父类，如：
 * 频道、菜单、tab等功能
 * 
 * 子类是可以在界面上生成菜单项的(频道、菜单、tab)，所以这个类的子类应该是可以生成button按钮。
 * 这里应该定义包括按钮生成的一些方式
 * 
 * 有：{@link #internalId}
 * 
 * @author jackson
 *
 * @see AbstractMenuable
 * @see MenuDefinitionImpl
 * @see ChannelDefinitionImpl
 * @see TabsDefinition
 */
public abstract class AbstractItemable extends XpathItemable implements ItemableDefinition, ParentContainer{
	
	/** 会生成button上的title，如果没有定义，则直接使用按钮的名称 */
	protected String title;
	
	protected String href;
	
	protected String at;
	
	private String iconCls;

	/** 菜单所在的子系统 */
	protected ModuleDefinition module;
	/** 这个节点的父节点容器 */
	protected ParentContainer parent;
	/** 菜单所在的平台的上下文，可以从这个上下文访问菜单管理器的内容 */
	protected PlatformContext platformContext;
	protected DescribeDefinitionImpl describe;
	
	protected String path;
	
	protected String internalId;

//	@Override
	public String getPath() {
		return path;
	}
	
	public DescribeDefinition getDescribe() {
		return describe;
	}
	
	public String getInternalId() {
		return internalId;
	}
	
	public void setDescribe(DescribeDefinitionImpl describe) {
		this.describe = describe;
	}

	protected void init(PlatformContext platformContext, ModuleContext moduleContext, ParentContainer parent){
		this.parent = parent;
		this.platformContext = platformContext;
		this.module = moduleContext.getModule();
		this.xpath = platformContext.xpathGenerate(parent.getXpath());
		this.title = StringHelper.get(title, name);
		
		if(null != describe) {
			describe.init(platformContext, this);
		}
	}
	
	protected void _button(String href, StringBuilder a, String selected) {
		a.append("<a href='").append(href);
		a.append("' title='").append(title);
		a.append("' class='").append(selected).append("' ");
		resolveAdditiveAttributes(a);
		if(StringHelper.isNotEmpty(at)){
			a.append(" at='").append(at).append("'");
		}
		a.append(" id='mid_").append(id).append("' >");
		resolveButtonName(a);
		a.append("</a>");
	}
	
	/** 附加属性 */
	protected void resolveAdditiveAttributes(StringBuilder a){ }
	
	/** 生成的菜单的名称 */
	protected void resolveButtonName(StringBuilder a){
		a.append(name);
	}

	protected abstract ChannelDefinitionImpl internalChannel();
	
	public final boolean selected(String selected) {
		return id.equals(selected);
	}
	
	@Override
	public final ChannelDefinition getChannel() {
		return internalChannel();
	}

	public String getIconCls() {
		return iconCls;
	}

	public void setIconCls(String iconCls) {
		this.iconCls = iconCls;
	}

	public final ModuleDefinition getModule() {
		return module;
	}
	
	public final String getTitle() {
		return title;
	}
	
	public final void setTitle(String title) {
		this.title = title;
	}

	public final String getHref() {
		return href;
	}

	public String getAt() {
		return at;
	}

	public void setAt(String at) {
		this.at = at;
	}
}
